package io.sunny.platform.ai.deepseek.sql.service;

import io.sunny.platform.ai.deepseek.sql.result.QueryResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * @Author SUNNY
 * @Date 2025/11/6 14:27
 * @PackageName: io.sunny.platform.ai.deepseek.sql.service
 * @Description: 智能查询服务实现
 * @Version 1.0
 */
@Service
@Slf4j
public class NaturalLanguageQueryService {
    private final ChatClient chatClient;
    private final JdbcTemplate jdbcTemplate;

    /**
     * 数据库元数据描述 - 这是AI理解数据结构的桥梁
     */
    private static final String DATABASE_SCHEMA = """
            数据库表结构详情:
            
            用户表(user):
            - id: BIGINT, 主键，唯一标识用户
            - name: VARCHAR(100), 用户真实姓名
            - age: INTEGER, 用户年龄，范围18-100
            - city: VARCHAR(50), 用户所在城市
            - balance: DECIMAL(10,2), 用户余额，精度到分
            - department_id: INTEGER, 外键，关联部门表
            
            部门表(department):
            - id: BIGINT, 主键，部门唯一标识
            - name: VARCHAR(100), 部门名称
            - manager: VARCHAR(100), 部门负责人
            - create_time: DATETIME, 部门创建时间
            
            表关联关系:
            user.department_id = department.id
            """;

    /**
     * 优化的提示词模板
     */
    private static final String SQL_GENERATION_PROMPT = """
            你是一个专业的SQL开发专家，请基于以下数据库结构生成准确、高效的MySQL查询语句。
            
            数据库结构:
            {schema}
            
            生成要求:
            1. 严格只返回SQL语句，不包含任何解释性文字
            2. 使用标准MySQL 8.0语法
            3. 明确指定查询字段，避免使用SELECT *
            4. 字符串条件使用单引号，正确转移特殊字符
            5. 合理使用JOIN替代子查询提升性能
            6. 包含必要的WHERE条件避免全表扫描
            
            用户查询需求: {query}
            """;

    public NaturalLanguageQueryService(ChatClient chatClient, JdbcTemplate jdbcTemplate) {
        this.chatClient = chatClient;
        this.jdbcTemplate = jdbcTemplate;
    }

    public QueryResult executeNaturalLanguageQuery(String userQuery) {
        try {
            String generatedSql = generateSql(userQuery);
            log.info("AI生成SQL: {}", generatedSql);

            //TODO 基础SQL安全校验

            List<Map<String, Object>> results = jdbcTemplate.queryForList(generatedSql);

            return QueryResult.success(results, generatedSql);
        } catch (Exception e) {
            log.error("自然语言查询执行失败: {}", e.getMessage());
            return QueryResult.error("查询执行失败: " + e.getMessage());
        }
    }

    private String generateSql(String userQuery) {
        String prompt = SQL_GENERATION_PROMPT
                .replace("{schema}", DATABASE_SCHEMA)
                .replace("{query}", userQuery);

        ChatResponse response = chatClient.prompt()
                .user(prompt)
                .call()
                .chatResponse();

        return response.getResult().getOutput().getText();
    }
}
